/*******************************************************************************
 * @author scl
 * @email shchlu188@163.com
 *      @brief 实现esp8266的驱动
 ******************************************************************************/
#include "module_esp8266.h"
#include "bsp.h"

extern data_frame_t esp_rx_frame;

static void sys_delay(uint32_t ms) {
    HAL_Delay(ms);
}

/**
 * @brief esp8266 驱动外设初始化
 */
void esp8266_driver_init() {
    /*设置系esp8266延时回调*/
    esp8266_set_delay_call(sys_delay);
    /*配置 CH_PD 引脚*/
    gpio_init(GPIOB, GPIO_PIN_8, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH);
    /* 配置 RST 引脚*/
    gpio_init(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH);
    /*串口配置*/
    com3_init(115200);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8 | GPIO_PIN_9, GPIO_PIN_SET);
    /*开启串口中断*/
    UART_ENABLE_IT(USART3, UART_IT_RXNE);    /** 开启串口中断*/
    UART_ENABLE_IT(USART3, UART_IT_IDLE);   /** 开启串口空闲中断*/
}

/**
 * @brief esp8266 复位引脚
 * @param flag true: 置高； false: 置低
 */
void esp8266_rst_pin(bool flag) {
    if (flag) {
        pin_high(GPIOB, GPIO_PIN_9);
    } else {
        pin_low(GPIOB, GPIO_PIN_8);
    }
}

/**
 * @brief esp8266 使能引脚
 * @param flag true: 使能
 */
void esp8266_ch_enable(bool flag) {
    if (flag) {
        pin_high(GPIOB, GPIO_PIN_8);
    } else {
        pin_low(GPIOB, GPIO_PIN_8);
    }
}


/**
 * @brief esp8266 发送数据
 * @param data
 * @param len
 */
void esp8266_send(void *data, uint16_t len) {
    HAL_UART_Transmit(com_handle_get(com3), data, len, 1000);
}

/**
 * @brief 清空接收缓冲区
 */
void esp8266_clear_buf(void) {
    esp_rx_frame.InfAll = 0;
}

/**
 * @brief esp8266 接收数据
 * @return 接收数据
 */
char *esp8266_rec() {
    if (esp_rx_frame.InfBit.frame_finished_flag != 0) {
        /*添加结束符*/
        esp_rx_frame.p_rx_buf[esp_rx_frame.InfBit.frame_len] = '\0';
        esp_rx_frame.InfAll = 0;// 清除一次标志位
        return esp_rx_frame.p_rx_buf;
    }
    return NULL;
}

/**
 * @brief esp8266 构造指令的缓存区
 * @return
 */
char *esp8266_get_cmd_buf() {
    static char esp8266_buf[200] = {0};
    return esp8266_buf;
}